iT邦幫忙

2025 iThome 鐵人賽

DAY 21
1
Modern Web

即時金融數據分析與區塊鏈應用實作:從網頁到計量交易模擬系列 第 21

信用卡詐欺偵測的分類(Classification)實戰範例

  • 分享至 

  • xImage
  •  

Web Modern|信用卡詐欺偵測的入門範例

用分類(Classification)方法,一步步學會如何找出可疑交易

💳 信用卡詐欺偵測:超簡單學習表(精簡版)

步驟 在做什麼 白話名詞 生活比喻
1 問題:分正常或詐欺 分類:兩類 分水果是蘋果或橘子
2 打開資料 資料表格 打開 Excel
3 分練習/考試 train/test 把題目分成練習卷 & 考卷
4 補齊少數例子 SMOTE 請臨演多演冷門角色
5 建立模型 隨機森林 一群老師投票決定
6 做預測 predict 老師幫忙批考卷
7 看成績 Precision/Recall 看對幾題、錯幾題
8 解釋結果 Accuracy ≠ 全部 考99分但錯在重點題
9 改進方法 換模型 / 調門檻 醫生判斷嚴格或放寬

📝 小結

  • 流程就像「讀資料 → 分練習卷/考卷 → 老師投票 → 批成績」。
  • 要特別注意 有沒有漏掉詐欺交易,比整體分數更重要。
  • 想更好,可以換模型或調整判斷標準。

1. 什麼是分類?

  • 分類(Classification):就是把資料分到不同的類別。
  • 在信用卡詐欺案例裡,我們要分成:
    • 0 = 正常交易
    • 1 = 詐欺交易

👉 就像醫生判斷病人是「健康」還是「生病」一樣,電腦要學會把交易分成「安全」或「可疑」。


2. 我們的資料

  • 每筆交易有一些特徵(就像病人的檢查數據):
    • 金額 (Amount):交易花了多少錢
    • 時間 (Time):發生時間
    • 其他匿名數據 (V1 ~ V28):這些是處理過的行為數據

📌 問題:詐欺交易很少,通常不到 1%。這叫做「不平衡資料」。


3. 怎麼處理資料?

  1. 平衡資料:因為詐欺太少,要讓電腦多看到一些詐欺例子。方法有:
    • SMOTE:把少數的詐欺樣本「複製+合成」一些新的。
    • 欠採樣:少拿一些正常交易,避免太多。
  2. 標準化:把金額、時間等數字調整到同樣的範圍,避免偏差。

4. Python 程式碼(簡單版)

python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
from imblearn.over_sampling import SMOTE

讀取資料

df = pd.read_csv("creditcard.csv")

特徵與標籤

X = df.drop("Class", axis=1) # 除了 Class 以外的所有欄位
y = df["Class"] # 0 或 1

切分資料(8:2,並保持比例)

X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)

用 SMOTE 讓訓練資料比較平衡

smote = SMOTE(random_state=42)
X_train_res, y_train_res = smote.fit_resample(X_train, y_train)

建立模型(隨機森林)

clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train_res, y_train_res)

預測

y_pred = clf.predict(X_test)

評估結果

print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred, digits=4))


  1. 可能的結果

混淆矩陣(Confusion Matrix)

[[56845 10]
[ 25 102]]

左上角:正確判斷「正常交易」

右下角:正確判斷「詐欺」

右上角:把正常誤判成詐欺(假警報)

左下角:把詐欺當成正常(漏掉!)

分類報告(Classification Report)

precision recall f1-score support

0 0.9996 0.9998 0.9997 (正常)
1 0.9107 0.8031 0.8537 (詐欺)

📊 混淆矩陣 (Confusion Matrix)

預測:正常 (0) 預測:詐欺 (1)
實際:正常 (0) 真正例 (TN):56845 ✅ 假正例 (FP):10 ❌
實際:詐欺 (1) 假負例 (FN):25 ❌ 真正例 (TP):102 ✅

📝 名詞解釋

  • TN (True Negative):預測正常,實際也正常 → 判斷對了。
  • FP (False Positive):預測詐欺,但實際正常 → 誤判。
  • FN (False Negative):預測正常,但實際是詐欺 → 漏抓。
  • TP (True Positive):預測詐欺,實際也是詐欺 → 抓對。

🎯 白話比喻(以醫生看病為例)

  • TN:醫生說沒病 → 真的沒病 ✅
  • FP:醫生說有病 → 其實沒病 ❌
  • FN:醫生說沒病 → 其實有病 ❌(最危險 🚨)
  • TP:醫生說有病 → 真的有病 ✅

  1. 怎麼解讀?

Accuracy(99.9%):看起來超高,但因為正常交易很多,不代表真的厲害。

Recall(80.3%):還有快 20% 的詐欺交易沒抓到。

Precision(91.1%):有 9% 的交易其實不是詐欺卻被誤報。

👉 在金融業,漏抓詐欺(Recall 太低)比誤抓更危險。


  1. 可以怎麼改進?

換更厲害的模型(例如 XGBoost、LightGBM)。

調整判斷門檻:不要只看大於 0.5 就判詐欺,可以改成 0.3 或 0.7。

加更多特徵,例如「使用地點」、「交易裝置」。

使用「異常偵測」的方法來輔助。


  1. 如果要放到網路服務(Web Modern)

  2. 建立 API:把模型放在伺服器,讓系統能即時查詢。

  3. 人工覆核:高風險交易要交給人員再次確認。

  4. 監控:即時看 Recall、Precision,避免模型變差。

  5. 更新:定期用新資料重新訓練。


  1. 常見問題

Q:為什麼不能只看準確率?
A:因為正常交易太多,準確率會誤導,要看 Recall。

Q:SMOTE 是什麼?
A:一種把少數類別(詐欺)複製+合成,讓資料更平衡的方法。

Q:調整門檻有什麼用?
A:可以控制「寧可多誤報,也不要漏掉」或相反。


🔄 回顧總表(入門版)

步驟 做什麼 白話解釋

1 問題設定 讓電腦判斷交易是「正常」還是「詐欺」
2 準備資料 有金額、時間、行為特徵,但詐欺很少
3 處理資料 用 SMOTE 平衡數據,標準化數值
4 寫程式 用 Python 建立隨機森林模型
5 看結果 混淆矩陣 + Precision/Recall
6 解讀 高準確率≠好,重點是漏判少
7 改進方法 換模型、調門檻、加特徵
8 放到網路 API + 人工覆核 + 監控更新
9 FAQ 回答常見疑問,避免誤解


🔗 信用卡詐欺偵測 × Web Modern 的關係

在 Web Modern 的思維裡,重點是把 資料處理、AI 模型、即時互動 與 網路應用 整合成一個完整服務。

前端(Frontend):例如銀行的網頁或手機 App,當使用者刷卡時,交易資料會即時送出。

後端(Backend + AI 模型):模型接收到交易資料,立即判斷這筆交易是不是可疑(分類:0 正常 / 1 詐欺)。

回饋(Feedback Loop):結果會回傳給系統,如果是高風險,就可能觸發「簡訊驗證」或「人工覆核」。

監控與更新(Monitoring & Update):Web Modern 強調即時監控,因此 Recall、Precision 這些指標要能在線上看;同時也要能自動更新模型,避免資料過時。

👉 換句話說,信用卡詐欺偵測只是 一個 AI 模型,而 Web Modern 提供了「把它放進線上應用」的基礎設施,讓模型不只是做研究,而是能真正即時保護使用者。

信用卡詐欺偵測學習導讀表

副標題|從概念 → 資料 → 程式碼 → 名詞,逐步學會分類分析


導讀表(層次學習)

學習階段 學習重點 Python 程式碼(片段) 名詞 & 語法說明
1. 認識分類問題 什麼是「分類」?我們要把交易分成 正常(0)詐欺(1) (無程式) 分類 (Classification):把資料分成不同類別。Label(標籤):這裡是 0 或 1。
2. 載入資料 先把資料讀進來,看看有哪些欄位 python<br>import pandas as pd<br>df = pd.read_csv("creditcard.csv")<br> pandas:Python 常用的資料處理套件。read_csv:讀取 CSV 檔案。
3. 切分資料 把資料分成 訓練集(80%)測試集(20%) python<br>from sklearn.model_selection import train_test_split<br>X = df.drop("Class", axis=1)<br>y = df["Class"]<br>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)<br> train_test_split:切分資料。stratify=y:保持類別比例不失真。
4. 平衡資料 SMOTE 讓「詐欺交易」的樣本增加 python<br>from imblearn.over_sampling import SMOTE<br>smote = SMOTE(random_state=42)<br>X_train_res, y_train_res = smote.fit_resample(X_train, y_train)<br> SMOTE:過採樣方法,讓少數類別(詐欺)變多。fit_resample:生成新的訓練資料。
5. 建立模型 隨機森林 (Random Forest) 訓練 python<br>from sklearn.ensemble import RandomForestClassifier<br>clf = RandomForestClassifier(n_estimators=100, random_state=42)<br>clf.fit(X_train_res, y_train_res)<br> RandomForestClassifier:一種樹模型,常用於分類。n_estimators=100:用 100 棵樹。
6. 預測 用模型判斷測試集的資料 python<br>y_pred = clf.predict(X_test)<br> predict:輸入測試資料,輸出預測結果(0 或 1)。
7. 評估模型 看混淆矩陣與指標 python<br>from sklearn.metrics import classification_report, confusion_matrix<br>print(confusion_matrix(y_test, y_pred))<br>print(classification_report(y_test, y_pred, digits=4))<br> confusion_matrix:看對/錯的判斷數量。classification_report:Precision、Recall、F1。
8. 解釋結果 - Accuracy 很高可能是因為「正常交易多」- Recall 低代表漏抓詐欺 (無程式) Accuracy:整體正確率。Precision:判成詐欺中,正確比例。Recall:真正的詐欺被抓到的比例。
9. 改進方法 - 換更強模型(XGBoost)- 調整閾值- 加新特徵 (進階程式可補充) Threshold:分類的門檻。特徵 (Feature):用來判斷的變數。

🔄 回顧總表

步驟 白話解釋 程式碼重點
1 知道要分成正常/詐欺 (無程式)
2 載入資料 pd.read_csv
3 切分訓練/測試集 train_test_split
4 平衡資料 SMOTE
5 建立模型 RandomForestClassifier
6 做預測 .predict()
7 評估表現 confusion_matrix / classification_report
8 看懂數字 Accuracy / Precision / Recall
9 改進與調整 換模型、調 threshold、加特徵


上一篇
📈 從日常到金融:計量交易模擬的生活故事
系列文
即時金融數據分析與區塊鏈應用實作:從網頁到計量交易模擬21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言